home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / SWAG / SWAGA_C / CHARS.SWG / 0003_Switch Font Characters.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  3KB  |  98 lines

  1. {
  2. > How can I redefine the ASCII Chars. For example how can
  3. > I make the ASCII code 65 become a "weird form" instead
  4. > of an "A".
  5.  
  6. You want it, you got it.  Here are the two Procedures you need, plus some
  7. info. First, you need to make a data Type With an Array of [1..16] of Byte,
  8. so the best idea would be this:  Make a Record as follows:
  9. }
  10.  
  11. Type
  12.   CharRec = Record
  13.     data : Array[1..16] of Byte;
  14.   end;
  15.  
  16. { Now, make a Variable to contain the entire Character set. }
  17.  
  18. Var
  19.   CharSet : Array[0..255] of CharRec;
  20.  
  21. { Next, you'll need the two Procedures: }
  22.  
  23. Procedure GetImageChar(chrVal : Byte; Var CharInfo);
  24. Var
  25.   offset : Word;
  26. begin
  27.   offset := chrVal * 32;
  28.   Inline($FA);
  29.   PortW[$3C4] := $0402;
  30.   PortW[$3C4] := $0704;
  31.   PortW[$3CE] := $0204;
  32.   PortW[$3CE] := $0005;
  33.   PortW[$3CE] := $0006;
  34.   (* refer to following notes For info about the next line *)
  35.   Move(Ptr($A000, offset)^, CharInfo, 16);
  36.   PortW[$3C4] := $0302;
  37.   PortW[$3C4] := $0304;
  38.   PortW[$3CE] := $0004;
  39.   PortW[$3CE] := $1005;
  40.   PortW[$3CE] := $0E06;
  41.   Inline($FB);
  42. end;
  43.  
  44. {
  45. OK.  That's the Procedure to GET a Character bitmap, and store it in a
  46. Variable.  So, if you use the Type and Var I defined at the top, do this:
  47.  
  48. GetImageChar(65, CharSet[65]);
  49.  
  50. This example will copy the bitmap from Character 65 (A) into the Record of 65,
  51. so you'll have copied the bitmap For 'A'.  Now, you can edit the bitmap (I
  52. wrote my own font editor) and Write it to memory With a second Procedure.
  53.  
  54. Here's the tricky part.  I didn't Write the 2nd Procedure because it is
  55. identical to the first *EXCEPT* For ONE line.  Copy the Procedure and change
  56. it's name to SetImageChar, and change this line:
  57.  
  58. Move(Ptr($A000, offset)^, CharInfo, 16);
  59.  
  60. and make it read:
  61.  
  62. Move(CharInfo, Ptr($A000, offset)^, 16);
  63.  
  64. That's it!  Have fun!  TTYL.
  65. }
  66.  
  67. {
  68. OK, 'data' is an Array [1..16] of Byte.  So, you just draw your Character on
  69. Graph paper in binary, convert to decimal Bytes, put them in the Array, and
  70. feed it into this Procedure.  'CharNum' is the ASCII value of the Character you
  71. want to remap.  To make a Procedure that READS the bitmap instead of writing,
  72. just change the line With 'Move(data, Ptr($A000, offset)^, 16)' and make it say
  73. 'Move(Ptr($A000, offset)^, data, 16);' and you will now be able to read bitmaps
  74. from the Character set.  I'm running out of time, so I can't explain it very
  75. well, but I hope this helps.  TTYL.
  76. }
  77. {
  78.  
  79.   I ran that in a loop and after a While it screwed up the whole
  80.   font - might just be my EGA card, but my opinion is that this
  81.   method stinks...there are Registers For getting/setting the
  82.   font; I found code from a Program called Display Font Editor
  83.   (DFE).  DFE edits font Files, and it came With source to
  84.    load these font Files. Following is a bit from setting
  85.   the Registers to load a font (don't have getting a font)
  86.  
  87.   r.ax := $1110;
  88.   r.bh := 14;                   (* Bytes per Character *)
  89.   r.bl := 0;                    (* load to block 0 *)
  90.   r.cx := 256;                  (* 256 Characters *)
  91.   r.dx := 0;                    (* start With Character 0 *)
  92.   r.es := Seg(P^);              (* segment of table *)
  93.   r.bp := Ofs(P^);              (* offset of the table *)
  94.   intr($10, r);
  95.  
  96.   With this, you can see, you can even do one Character at a
  97.   time ( cx = 1, dx = ascii, P^ = Array[1..14] of Byte)
  98. }